package com.blumov.fastbox.infrastructure.persistence.hibernate.producto;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.criterion.Expression;

import com.blumov.fastbox.domain.model.producto.Producto;
import com.blumov.fastbox.domain.model.producto.ProductoRepository;
import com.blumov.fastbox.domain.model.producto.Promocion;
import com.blumov.fastbox.infrastructure.persistence.dataaccess.simpledao.SimpleDAO;

/**
 * Una implementacion de {@link ProductoRepository} usando Hibernate.
 * 
 * @author Bruno Masci
 */
public class ProductoRepositoryHibernate implements ProductoRepository {

	private SimpleDAO simpleDAO;

	private final static String productoClassName = Producto.class.getName();
	private final static String promocionClassName = Promocion.class.getName();
	
	
	private ProductoRepositoryHibernate() {
	}
	
	/**
	 * @see com.blumov.fastbox.domain.model.producto.ProductoRepository#find(java.lang.String)
	 */
	public Producto find(String codigoProducto) {
	    Criteria criteria = simpleDAO.createCriteria(Producto.class);
	    criteria.add(Expression.eq("codigo", codigoProducto));
	    Producto producto = (Producto) criteria.uniqueResult();
	    
	    // Null Object pattern
	    return (producto == null) ? Producto.NONE : producto;
	}

	/**
	 * @see com.blumov.fastbox.domain.model.producto.ProductoRepository#findPromocionesVigentes()
	 */
	@SuppressWarnings("unchecked")
	public List<Producto> findPromocionesVigentes() {
		Query query = simpleDAO.createQuery(
				"SELECT producto " +
				"FROM " + productoClassName + " producto, " + promocionClassName + " promocion " +
				"WHERE producto.codigo = promocion.codigo " +
				"AND promocion.estado = 0");

		return (List<Producto>)query.list();
	}

	/**
	 * Injected by Spring
	 */
	public void setSimpleDAO(SimpleDAO simpleDAO) {
		this.simpleDAO = simpleDAO;
	}
}
